<!DOCTYPE html>
<!-- V171020-2 -->
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Release notes for embOS V5.14.0</title>
<meta http-equiv="content-language" content="de">
<meta name="robots" content="noindex,nofollow">
<meta http-equiv="pragma" content="no-cache">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type="text/css">
body {
  margin: 0;
  background-color: #4F5157;
  color: #3B3D3F;
  font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
 font-size: 0.9rem  line-height: 1.5;
  min-width: 400px;
}
.header{
  background: #2C5B9C;
  }
.head {
  color: #fff;
  padding: 20px 30px;
}
.head h2 {
  color: #fff;
}
.headh3 li, .head h3 a, .head a {
  color: #fff;
}
.footer {
  color: #4f5157;
  background: #BFC3C6;
  padding: 20px;
  border-top: 1px solid #fff;
  border-bottom: 1px solid #fff;
}
.footer h2 {
  color: #bfc3c6;
}
.footer h3 li, .footer h3 a, .footer a {
  color: #000;
}

.divider-global {
  border-top: 2px solid #fff;
  padding: 20px 30px;
}
h1 {
  margin-bottom: 30px;
  text-align: left;
  font-size: 1.5em;
  color: #fff;
  border-bottom: 1px solid #fff;
}
h2 {
  text-align: left;
  font-size: 1.2em;
  color: #002F5C;
  text-decoration: underline;
  display: inline-block;
}
h3 {
  text-align: left;
  font-size: 1.0em;
}
h3 li {
  margin: 10px 0;
}
div.divider-global:nth-of-type(odd) {
  background: #F2F2F2;
}
div.divider-global:nth-of-type(even) {
  background: #F6F6F6;
}
.toolChain Table {
  max-width: 1000px;
}
.toolChain Table th {
  font-weight: 600;
  text-align: left;
  width: 12%;
}
#seggerLogo {
  padding: 20px 30px;
  display: inline-block;
}
.claim {
  font-size: 20px;
  display: inline-block;
  color: #fff;
  line-height: 115px;
  vertical-align: top;
}
 @media screen and (max-width: 600px) {
.claim {
  display: none;
}
}
 @media screen and (min-width: 600px) {
.claim {
  font-size: 200%;
}
}
 @media screen and (min-width: 1024px) {
.claim {
  font-size: 300%;
}
}
</style>
</head>
<body class="en" id="top">
<main class="main-content" id="content" role="main">
  <div class="header">
    <div class="row">
      <div id="seggerLogo"> <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="150px" height="75px" viewBox="110 27.5 150 75" style="enable-background:new 110 27.5 150 75;" xml:space="preserve">
        <style type="text/css">

  .st0{fill:#FFFFFF;}
  .st1{fill:#005CA8;}
  .st2{fill:#010000;}

</style>
        <g>
          <g>
            <path class="st0" d="M258,96.1c0,2.6-2,4.7-4.4,4.7H115.9c-2.4,0-4.4-2.1-4.4-4.7V33.7c0-2.6,2-4.7,4.4-4.7h137.7
      c2.4,0,4.4,2.1,4.4,4.7"></path>
            <path class="st2" d="M253.7,102.3H115.9c-3.3,0-5.9-2.8-5.9-6.2V33.7c0-3.5,2.6-6.2,5.9-6.2h137.7c3.3,0,5.9,2.8,5.9,6.2v62.4
      C259.6,99.5,256.9,102.3,253.7,102.3z M115.9,30.6c-1.6,0-2.8,1.4-2.8,3.1v62.4c0,1.7,1.3,3.1,2.8,3.1h137.7
      c1.6,0,2.8-1.4,2.8-3.1V33.7c0-1.7-1.3-3.1-2.8-3.1H115.9z"></path>
          </g>
          <polygon class="st1" points="117.8,52.4 127.1,64.9 117.8,77.3   "></polygon>
          <g>
            <path class="st1" d="M131.6,41.3l15.6,20.3v0.1c0.4,0.5,1,1,1.7,1h99.7c1.2,0,2.2-1.1,2.2-2.3c0-1.2-1-2.3-2.2-2.3H150l-14.9-19.4
      l0,0c-0.4-0.5-1-0.9-1.7-0.9c-1.2,0-2.2,1-2.2,2.2C131.2,40.4,131.4,40.9,131.6,41.3L131.6,41.3z"></path>
            <path class="st1" d="M140.4,66.3c0.3-0.4,0.5-0.9,0.5-1.4c0-0.5-0.2-1-0.5-1.4l-18.6-24.9l0,0c-0.4-0.5-1-0.9-1.7-0.9
      c-1.2,0-2.2,1-2.2,2.2c0,0.5,0.2,1,0.5,1.4l17.6,23.5l-17.7,23.5c-0.3,0.4-0.5,0.9-0.5,1.4c0,1.2,1,2.2,2.2,2.2
      c0.7,0,1.3-0.3,1.7-0.9l0,0L140.4,66.3z"></path>
            <path class="st1" d="M248.7,67.2h-99.8c-0.7,0-1.3,0.4-1.7,1v0.1l-15.6,20.3l0,0c-0.3,0.3-0.5,0.8-0.5,1.3c0,1.2,1,2.2,2.2,2.2
      c0.7,0,1.3-0.3,1.7-0.9v0.1l15-19.4h98.7c1.2,0,2.2-1.1,2.2-2.3S249.9,67.2,248.7,67.2z"></path>
          </g>
          <path class="st2" d="M163,80.7c0,0.4-0.1,0.7-0.4,1c-0.3,0.2-0.7,0.3-1.2,0.3c-0.6,0-1.2-0.3-1.8-1c-0.2-0.2-0.3-0.3-0.3-0.3
    c-0.3-0.3-0.7-0.5-1.2-0.7c-0.5-0.1-1-0.2-1.7-0.2c-0.9,0-1.6,0.2-2.1,0.5c-0.5,0.3-0.7,0.7-0.7,1.3c0,0.7,1,1.3,2.9,1.7
    c0.5,0.1,0.9,0.2,1.1,0.2c1.2,0.2,2.1,0.5,2.7,0.6s1,0.3,1.5,0.5c0.7,0.3,1.2,0.8,1.6,1.3c0.3,0.6,0.5,1.2,0.5,2
    c0,1.4-0.6,2.6-1.8,3.4c-1.2,0.9-2.8,1.3-4.9,1.3c-1.2,0-2.1-0.1-2.9-0.3c-0.8-0.2-1.6-0.5-2.4-1c-0.5-0.3-0.9-0.7-1.2-1.2
    s-0.5-0.9-0.5-1.3c0-0.4,0.1-0.7,0.4-1c0.3-0.3,0.7-0.4,1.2-0.4c0.6,0,1.2,0.3,1.7,1c0.2,0.3,0.3,0.5,0.5,0.6
    c0.3,0.3,0.7,0.6,1.3,0.8c0.5,0.2,1.1,0.2,1.8,0.2c1.1,0,1.9-0.2,2.5-0.5c0.6-0.3,0.9-0.8,0.9-1.4c0-0.9-1.4-1.6-4.3-2.1
    c-0.1,0-0.2-0.1-0.2-0.1c-2.2-0.4-3.7-1-4.5-1.6c-0.8-0.6-1.2-1.6-1.2-2.8c0-1.4,0.6-2.5,1.7-3.2c1.1-0.7,2.8-1.2,4.8-1.2
    c1,0,1.8,0.1,2.6,0.3c0.7,0.2,1.5,0.5,2.1,0.9c0.5,0.3,0.9,0.6,1.2,1C162.8,79.9,163,80.3,163,80.7z"></path>
          <path class="st2" d="M177.8,89.6c0.6,0,1.1,0.1,1.4,0.3c0.3,0.2,0.5,0.6,0.5,1s-0.2,0.7-0.5,1c-0.3,0.2-0.8,0.3-1.4,0.3h-9
    c-0.8,0-1.4-0.2-1.7-0.5c-0.3-0.3-0.5-0.9-0.5-1.8V80c0-0.9,0.1-1.5,0.5-1.8c0.3-0.3,0.9-0.5,1.7-0.5h8.6c0.6,0,1.1,0.1,1.4,0.3
    c0.3,0.2,0.5,0.5,0.5,1c0,0.4-0.2,0.7-0.5,0.9c-0.3,0.2-0.8,0.3-1.4,0.3h-7.2v3.1h6.5c0.6,0,1.1,0.1,1.4,0.3c0.3,0.2,0.5,0.5,0.5,1
    c0,0.4-0.2,0.7-0.5,0.9c-0.3,0.2-0.8,0.3-1.4,0.3h-6.5v3.7L177.8,89.6L177.8,89.6z"></path>
          <path class="st2" d="M194.2,86.9h-2.6c-0.5,0-0.8-0.1-1.1-0.3c-0.3-0.2-0.4-0.5-0.4-0.9c0-0.3,0.1-0.7,0.4-0.9
    c0.3-0.2,0.6-0.3,1.1-0.3h3.8c0.7,0,1.3,0.1,1.6,0.3c0.3,0.2,0.5,0.6,0.5,1v5.6c0,0.5-0.1,0.7-0.3,1c-0.2,0.2-0.5,0.3-0.9,0.3
    c-0.3,0-0.6-0.1-0.9-0.2c-0.2-0.2-0.4-0.4-0.5-0.7l-0.3-1.1c-0.6,0.7-1.4,1.3-2.2,1.6c-0.8,0.3-1.7,0.5-2.8,0.5
    c-2.4,0-4.4-0.7-5.8-2.1c-1.5-1.4-2.2-3.3-2.2-5.6s0.7-4.2,2.2-5.6c1.5-1.4,3.5-2.1,5.9-2.1c0.8,0,1.6,0.1,2.2,0.2
    c0.7,0.1,1.4,0.3,2,0.6c0.9,0.4,1.5,0.8,2,1.3c0.5,0.5,0.7,1,0.7,1.4c0,0.4-0.2,0.7-0.5,1c-0.3,0.3-0.6,0.4-1.1,0.4
    c-0.4,0-0.7-0.1-1-0.2c-0.3-0.1-0.6-0.4-1-0.8c-0.5-0.5-1-0.9-1.4-1.1c-0.5-0.2-1.1-0.3-1.8-0.3c-1.4,0-2.6,0.5-3.4,1.3
    c-0.8,0.9-1.2,2.1-1.2,3.7c0,1.6,0.4,2.8,1.3,3.7c0.9,0.9,2.1,1.3,3.5,1.3c1.2,0,2.1-0.3,2.8-0.9C193.5,88.7,193.9,87.8,194.2,86.9
    z"></path>
          <path class="st2" d="M212.6,86.9H210c-0.5,0-0.8-0.1-1.1-0.3c-0.3-0.2-0.4-0.5-0.4-0.9c0-0.3,0.1-0.7,0.4-0.9
    c0.3-0.2,0.6-0.3,1.1-0.3h3.8c0.7,0,1.3,0.1,1.6,0.3c0.3,0.2,0.5,0.6,0.5,1v5.6c0,0.5-0.1,0.7-0.3,1c-0.2,0.2-0.5,0.3-1,0.3
    c-0.3,0-0.6-0.1-0.9-0.2c-0.2-0.2-0.3-0.4-0.5-0.7l-0.3-1.1c-0.6,0.7-1.4,1.3-2.2,1.6c-0.8,0.3-1.8,0.5-2.9,0.5
    c-2.4,0-4.4-0.7-5.9-2.1c-1.5-1.4-2.2-3.3-2.2-5.6s0.7-4.2,2.2-5.6c1.5-1.4,3.5-2.1,5.9-2.1c0.8,0,1.6,0.1,2.2,0.2
    c0.7,0.1,1.4,0.3,2,0.6c0.9,0.4,1.5,0.8,2,1.3c0.5,0.5,0.7,1,0.7,1.4c0,0.4-0.1,0.7-0.5,1c-0.3,0.3-0.7,0.4-1.1,0.4
    c-0.3,0-0.7-0.1-1-0.2c-0.3-0.1-0.6-0.4-1-0.8c-0.5-0.5-0.9-0.9-1.4-1.1c-0.5-0.2-1.1-0.3-1.8-0.3c-1.4,0-2.6,0.5-3.4,1.3
    c-0.8,0.9-1.2,2.1-1.2,3.7c0,1.6,0.4,2.8,1.3,3.7c0.9,0.9,2,1.3,3.5,1.3c1.1,0,2.1-0.3,2.8-0.9C212,88.7,212.5,87.8,212.6,86.9z"></path>
          <path class="st2" d="M230.5,89.6c0.6,0,1.2,0.1,1.4,0.3c0.3,0.2,0.5,0.6,0.5,1s-0.2,0.7-0.5,1c-0.3,0.2-0.8,0.3-1.4,0.3h-9
    c-0.8,0-1.4-0.2-1.7-0.5c-0.3-0.3-0.5-0.9-0.5-1.8V80c0-0.9,0.2-1.5,0.5-1.8c0.3-0.3,0.9-0.5,1.7-0.5h8.6c0.6,0,1.1,0.1,1.4,0.3
    s0.5,0.5,0.5,1c0,0.4-0.2,0.7-0.5,0.9c-0.3,0.2-0.8,0.3-1.4,0.3h-7.2v3.1h6.6c0.6,0,1.1,0.1,1.4,0.3c0.3,0.2,0.5,0.5,0.5,1
    c0,0.4-0.2,0.7-0.5,0.9c-0.3,0.2-0.8,0.3-1.4,0.3h-6.6v3.7L230.5,89.6L230.5,89.6z"></path>
          <path class="st2" d="M238.4,80.3v3.9h4.1c0.9,0,1.6-0.2,2-0.5c0.4-0.3,0.6-0.8,0.6-1.4c0-0.6-0.2-1.1-0.6-1.4
    c-0.4-0.3-1-0.5-1.8-0.5H238.4L238.4,80.3z M238.4,90.8c0,0.5-0.1,0.9-0.5,1.2c-0.3,0.3-0.7,0.4-1.3,0.4s-1-0.1-1.3-0.4
    c-0.3-0.3-0.5-0.7-0.5-1.2V80c0-0.9,0.2-1.5,0.5-1.8c0.3-0.3,0.9-0.5,1.7-0.5h6.2c1.9,0,3.3,0.3,4.1,1c0.9,0.7,1.4,1.7,1.4,3.1
    c0,0.9-0.2,1.6-0.7,2.2c-0.5,0.6-1.1,1-1.9,1.2c0.6,0.2,1.1,0.5,1.5,0.9c0.3,0.4,0.5,0.9,0.6,1.6c0.1,0.3,0.1,0.6,0.1,1
    c0,0.5,0.1,0.7,0.1,0.9c0.1,0.2,0.1,0.4,0.2,0.7c0.1,0.3,0.1,0.6,0.1,0.7c0,0.4-0.2,0.7-0.5,1c-0.3,0.2-0.7,0.3-1.3,0.3
    c-0.7,0-1.3-0.2-1.6-0.5c-0.3-0.3-0.5-1.3-0.6-2.8c-0.1-1.1-0.3-1.9-0.7-2.2c-0.3-0.3-1-0.4-1.9-0.4h-3.7v4.3H238.4z"></path>
        </g>
        </svg> </div>
      <div class="claim">The Embedded Experts</div>
      <div class="head">
        <div class="container">
          <!-- ****************************************************************** -->
          <!-- Modifiable information starts here                                 -->
          <!-- Don't forget to edit the title tag either                          -->
          <!-- ****************************************************************** -->
          <h1>Release notes for embOS V5.14.0</h1>
        </div>
      </div>
    </div>
  </div>
  <!-- ****************************************************************** -->
  <!-- History                                                       -->
  <!-- ****************************************************************** -->
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version 5.14.0 [28. Apr 2021]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Readers-writer lock added.</li>
          <li>New API function OS_INT_PreserveAndDisable() added.</li>
        </ol>
      </div>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>OS_TASK_Resume(), OS_TASK_ResumeAll() and OS_TASK_Suspend() can now also be called from main().</li>
        </ol>
      </div>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>Under rare circumstances, a round robin task could run although its time slice has expired.<br>
          The problem existed since embOS version 5.10.0 and is fixed with version 5.14.0.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version 5.12.0 [02. Oct 2020]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New API functions OS_EVENT_ResetMask() added.</li>
        </ol>
      </div>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>It is now allowed to pass NULL to OS_TIMER_Restart() and OS_TIMER_RestartEx().<br>
          This value indicates the current software running timer will be restarted.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version 5.10.2 [06. Jul 2020]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>Internal cast modified in order to support compiler which do not support a 64-bit data type.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version 5.10.1 [17. Jun 2020]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>Call of the tickless callback function corrected.<br>
          Under rare circumstances, the tickless callback function could be executed twice if OS_TICKLESS_Stop() was used in the application.<br>
          The problem existed since embOS version 4.00a and is fixed with version 5.10.1.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version 5.10.0 [05. Jun 2020]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Support for 64-Bit cores added.</li>
          <li>New API functions OS_TICKLESS_GetPeriod() and OS_TICKLESS_IsExpired() added.</li>
        </ol>
      </div>
    </div>
  </div>
  </div>  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version 5.8.2 [17. Dec 2019]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_TASK_SetContextExtension() corrected.<br>
          Under specific circumstances OS_TASK_SetContextExtension() could de-reference a NULL pointer in debug builds of embOS.<br>
          The problem existed since embOS version 5.8.0 and is fixed with version 5.8.2.
          </li>
        </ol>
        <h3>Improvements</h3>
        <ol>
          <li>Debug checks added to OS_MPU_SwitchToUnprivState().</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version 5.8.1 [11. Nov 2019]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_EVENT_GetMask() corrected.<br>
          Under specific circumstances OS_EVENT_GetMasked() clears all given EventMask bits but returns a different bit mask.<br>
          The problem existed since embOS version 4.32 and is fixed with version 5.8.1.
          </li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version 5.8.0 [30. Oct 2019]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New API function OS_TIME_Convertms2Ticks() and OS_TIME_ConvertTicks2ms() added.</li>
          <li>embOS-MPU support for cores with cache added.</li>
          <li>New embOS version format (Major.Minor.Patch).</li>
        </ol>
        <h3>Improvements</h3>
        <ol>
          <li>Extended API trace and debug checks added.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version 5.06 [20. Feb 2019]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New cycle precise timing API added:<br>
          OS_TIME_GetCycles()<br>
          OS_TIME_ConvertCycles2us()<br>
          OS_TIME_Convertus2Cycles()<br>
          OS_TIME_ConvertCycles2ns()<br>
          OS_TIME_Convertns2Cycles()<br>
          </li>
          <li>New API functions added:<br>
          OS_DeInit()<br>
          OS_DEBUG_RemoveObjName()<br>
          OS_TIME_GetInts()<br>
          OS_INFO_GetTimerFreq()<br>
          </li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_TIME_Getus() and OS_TIME_Getus64() corrected.<br>
          OS_TIME_Getus() and OS_TIME_Getus64() returned incorrect values when the tick frequency was unequal 1KHz.<br>
          The problem existed since embOS version 4.02 and is fixed with version 5.06.<br>
          </li>
          <li>OS_STAT_GetLoad() corrected.<br>
          OS_STAT_GetLoad() returned incorrect values when the tick frequency was unequal 1KHz.<br>
          The problem existed in all previous embOS versions and is fixed with version 5.06.
          </li>
         </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version 5.04 [14. Sep 2018]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New API function OS_MUTEX_IsMutex() added.<br>
            OS_MUTEX_IsMutex() returns whether a mutex has already been created.
          </li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>Compatibility macro corrected.<br>
            OS_MEMF_Request() is translated to OS_MEMPOOL_Alloc().<br>
            OS_MEMPOOL_Alloc() expects one parameter only but was called with two parameters.<br>
            The problem existed since embOS version 5.00 and is fixed with version 5.04.</li>
          </li>
         </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version 5.02a [09. Jul 2018]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>Minor changes to avoid compiler warnings with IAR EWRX V4.x compiler.
          </li>
         </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version 5.02 [26. Jun 2018]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New API function OS_STAT_AddLoadMeasurementEx() added.<br>
            OS_STAT_AddLoadMeasurementEx() allows to set an application defined stack and stack size for the CPU load measurement task.
          </li>
        </ol>
        <h3>Improvements</h3>
        <ol>
          <li>Under specific circumstances an unnecessary task switch could occur when using Round Robin.<br>
            This is no functional issue but has been improved for efficiency.<br>
            The issue existed in all previous embOS versions and is improved with version 5.02.
          </li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_Error() could be linked into the output although the embOS debug feature is disabled.<br>
            This is not a functional problem but could cause a minimal higher RAM and ROM usage.<br>
            The RAM usage increased by around 2-4 bytes and the ROM usage by around 40 Bytes.<br>
            The problem existed since embOS version 4.36 and is fixed with version 5.02.
          </li>
          <li>An issue with OS_TASK_SetPriority() could cause problems with other API functions when they are called from an interrupt routine:<br>
             OS_TASK_SuspendAll() does not suspend the task for which the priority is modified.<br>
             OS_TASK_ResumeAll() does not resume the task for which the priority is modified.<br>
             OS_STAT_Sample() does not calculate the task exec time for the task for which the priority is modified.<br>
             OS_TASK_GetNumTasks() returns the wrong number of tasks.<br>
             OS_TASK_IsTask() considers the task for which the priority is modified as non-existant.<br>
             OS_TASK_Index2Ptr() may return the wrong task control block.<br>
             embOSView temporarily displays wrong task information.<br>
             This issue occurs only when OS_TASK_SetPriority() is interrupted by an interrupt routine which calls one of above API functions.<br>
             The problem existed in all previous embOS versions and is fixed with version 5.02.
           </li>
           <li>OS_WD_Check() could trigger the reset callback function altough the timeout did not expire.<br>
             This issue can occur on 8/16 Bit CPUs under specific circumstances only.<br>
             The problem existed since embOS version 4.32 and is fixed with version 5.02.</li>
         </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version 5.00a [18. May 2018]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>Minor embOSView communication issue fixed.<br>
          Under specific circumstances, the embOSView communication could fail.<br>
          The problem existed in all previous embOS versions and is fixed with version 5.00a.
          </li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version 5.00 [08. May 2018]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>embOS V5 introduces a new simplified API name scheme which improves the usability.</li>
        </ol>
        <h3>Improvements</h3>
        <ol>
          <li>OS_SEMAPHORE_Give(), OS_SEMAPHORE_GiveMax(), OS_SEMAPHORE_GetValue(), OS_SEMAPHORE_Take() can now also be called from software timer.</li>
          <li>The extended task context is no longer restored when a task starts for the first time and it was set by OS_SetDefaultTaskContextExtension().</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>Under specific circumstances, a task was not executed after a priority inheritance was performed.<br>
            The problem did occur only when all of the following conditions were met:<br>
            a) A resource semaphore is used by at least two tasks and priority inheritance occurs.<br>
            b) There is at least one more task with higher priority than the inherited priority, and that task gets ready for execution by an interrupt before the task running on priority inheritance releases the resource semaphore.<br>
            This issue is very unlikely and happens only when the scheduler is interrupted at a certain point by an interrupt handler.<br>
            This issue existed since embOS version 4.40 and is fixed with embOS version 5.00.
          </li>
         </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version 4.40 [20. Dec 2017]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Trial limitation removed. embOS trial editions no longer stop functioning after a predefined run-time. This allows the usage of embOS trial editions for any non-commercial or educational purpose without any technical restrictions (while governed by the accompanying license conditions).</li>
          <li>Modified watchdog reset callback to take one parameter. This allows for investigation of the violated watchdog condition.</li>
        </ol>
        <h3>Improvements</h3>
        <ol>
          <li>Added debug checks for zero-size messages to OS_Q_Put[Ex](), OS_Q_PutBlocked[Ex]() and OS_Q_PutTimed[Ex]().</li>
          <li>Added debug checks for zero-period software timers to OS_CreateTimer[Ex]() and OS_SetTimerPeriod().</li>
          <li>Added further debug checks for valid API contexts to several API functions.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>Under specific circumstances, tasks were not executed after being involved in a priority inheritance.<br>
          The problem did occur only when all of the three following conditions were met:<br>
          a) Round Robin is disabled, which is true in OS_LIBMODE_XR library mode, or when working with embOS source code and configuring the compiler define OS_RR_SUPPORTED to 0.<br>
          b) A resource semaphore is used by at least two tasks and priority inheritance occurs.<br>
          c) There is at least one more task with lower priority than the inherited priority, and that task gets ready for execution before the task running on priority inheritance releases the resource semaphore.<br>
          This issue existed since embOS version 4.26 and is fixed with embOS version 4.40.</li>
         </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version 4.38 [20. Sept 2017]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New API functions OS_SetDefaultTaskStartHook(), OS_SetObjName() and OS_GetObjName() added.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>Debug assertion corrected.<br>
          A false positiv debug assertion could call OS_Error(OS_ERR_ILLEGAL_IN_TIMER) when a software timer was interrupted by an ISR.<br>
          This is a debug check issue only and does not affect the release embOS build.<br>
          The problem existed since embOS version 4.36 and is fixed with version 4.38.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.36  [12. Jul 2017]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New API functions OS_Stop() and OS_Config_Stop() added.</li>
          <li>New embOS library mode OS_LIBMODE_SAFE added.</li>
          <li>New API functions OS_SeStackCheckSetLimit() and OS_GeStackCheckSetLimit() added which are available in OS_LIBMODE_SAFE only.</li>
          <li>New API functions OS_MPU_SanityCheck() and OS_MPU_AddSanityCheckBuffer() added which are used in certified embOS-MPU</li>
        </ol>
        <h3>Improvements</h3>
        <ol>
          <li>embOSView communication module improved.<br>
            embOSView was limited to around 60 tasks in the task list window. embOS can send now information about much more tasks.<br>
            For this purpose the embOS communication buffer needs to be increased which is possible with the embOS source code only.</li>
          <li>embOS debug improved.<br>
            All embOS API functions detects if they were called from a legal context.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_TICK_HandleEx() did not work correctly in tickless mode.<br>
            The problem existed in all previous embOS versions and is fixed with version 4.36.</li>
          <li>When disabling Round Robin and using priority inheritance the debug code could call OS_Error() with the error code OS_ERR_TASK_PRIORITY by mistake.<br>
             This is a debug check issue only and does not affect the release embOS build.</li>
          <li>OS_EVENT_WaitMask() and OS_EVENT_WaitMaskTimed() corrected.<br>
            OS_EVENT_WaitMask() and OS_EVENT_WaitMaskTimed() did not return the correct result when AND logic was configured and the event mask was already set.<br>
            The problem existed since embOS version 4.34 and is fixed with version 4.36.</li>
          <li>OS_Q_PutBlocked(), OS_Q_PutBlockedEx(), OS_Q_PutTimed(), OS_Q_PutTimedEx() corrected.<br>
            These functions could fail when they were interrupted by an interrupt routine which picked up a message from the same queue.<br>
            The problem existed in all previous embOS versions and is fixed with version 4.36.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.34  [08. Mar 2017]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Event objects now support AND logic, therefore new API functions OS_EVENT_SetMaskMode() and OS_EVENT_GetMaskMode() have been added.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.32  [10. Jan 2017]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New API functions OS_EVENT_SetMask(), OS_EVENT_GetMask(), OS_EVENT_WaitMask() and OS_EVENT_WaitMaskTimed() added.</li>
          <li>New API functions OS_PutMailTimed() and OS_PutMailTimed1() added.</li>
          <li>New API functions OS_WD_Add(), OS_WD_Check(), OS_WD_Config(), OS_WD_Remove() and OS_WD_Trigger() added.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.30  [08. Dec 2016]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New API functions OS_GetMailTimed1(), OS_ClearSingleEvent(), OS_RemoveTerminateHook() and OS_MPU_SwitchToUnprivStateEx() added.</li>
        </ol>
        <h3>Improvements</h3>
        <ol>
          <li>OS_ResumeAllSuspendedTasks() renamed to OS_ResumeAllTasks().<br>
            OS_RemoveOnTerminateHooks() renamed to OS_RemoveAllTerminateHooks().<br>
            OS_AddOnTerminateHook() renamed to OS_AddTerminateHook().<br>
            The legacy function names can still be used for compatibility.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.26  [07. Sep 2016]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New API function OS_RemoveOnTerminateHooks() added.</li>
          <li>embOS version mismatch check added.<br>
          embOS checks now at runtime in OS_Start() if the embOS library and the RTOS.h are from the same version.<br>
          This is a very common mistake. In case of a version mismatch OS_Error() is called.
        </ol>
        <h3>Improvements</h3>
        <ol>
          <li>embOS scheduler regarding priority inheritance improved.<br>
            The scheduler was improved regarding priority inheritance for better performance.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.24  [28. Jun 2016]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Spinlock API for multi-core support added.</li>
        </ol>
        <h3>Improvements</h3>
        <ol>
          <li>Several SYSVIEW trace macros added to indicate task termination and execution end of API function.</li>
        </ol>
      </div>
    </div>
  </div>  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.22  [28. Jun 2016]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New API functions OS_Q_PutEx(), OS_Q_PutBlockedEx(), and OS_Q_PutTimedEx() added.<br>
          The new functions can be used to store a message, of which the distinct parts are distributed in memory, into a queue.
          </li>
        </ol>
      </div>
    </div>
  </div>  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.20  [28. Jun 2016]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>MPU support added.</li>
          <li>OS_AddExtendTaskContext() added.<br>
          OS_AddExtendTaskContext() can be used to have unlimited task context extensions.
          </li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_WaitMailTimed() corrected.<br>
            OS_WaitMailTimed() returned with disabled interrupts when a message was already in the mailbox.<br>
            The problem existed in all previous embOS versions and is fixed with version 4.20.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.16  [22. Jan 2016]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>MISRA-C:2012 compliance updated.<br>
          MISRA-C:2012 compliance is now checked with Gimpel Lint V9.0.
          </li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.14a  [15. Jan 2016]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_Q_Create() corrected.<br>
            OS_Q_Create() did not work correctly when integer size is 16bit and pointer size is greater than 16bit.<br>
            The queue buffer address is not correctly calculated and stored in the queue control structure.<br>
            The problem existed in all previous embOS versions and is fixed with version 4.14a.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.14  [03. Nov 2015]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New API function OS_SetDefaultTaskContextExtension() added.<br>
          OS_SetDefaultTaskContextExtension() can be used to set a default task context extension for newly created tasks.
          </li>
          <li>New API macros OS_INT_PRIO_PRESERVE() and OS_INT_PRIO_RESTORE() added.<br>
          OS_INT_PRIO_PRESERVE() / OS_INT_PRIO_RESTORE() can be used to preserve and restore the embOS interrupt status.
          </li>
          <li>New API functions OS_TriggerTimer() and OS_TriggerTimerEx() added.<br>
          OS_TriggerTimer() ends up a software timer at once and calls the software timer callback function.
          </li>
        </ol>
        <h3>Improvements</h3>
        <ol>
          <li>SYSVIEW and Percepio trace macros to OS_Mail_GetPtr(), OS_Mail_GetPtrCond() and OS_Mail_Purge() added.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_StopTicklessMode() corrected.<br>
            OS_StopTicklessMode() did not check if any delay was expired and if it is necessary to call the scheduler for further actions.<br>
            This could cause that a task or software timer was activated with an one system tick delay.<br>
            The problem existed in all previous embOS versions and is fixed with version 4.14.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.12b  [22. Sep 2015]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>SYSVIEW trace macros added.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.12a  [17. Sep 2015]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>SYSVIEW trace macros added/modified.</li>
          <li>OS_InInterrupt() modified.<br>
            OS_InInterrupt() does no longer return the value of OS_InInt which was set by OS_EnterInterrupt()/OS_EnterNestableInterrupt().<br>
            Now It rather returns the actual CPU interrupt state. This function is no longer available with every embOS port.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_StartTimer() corrected.<br>
            When a task was interrupted in OS_StartTimer() by another task which also calls OS_StartTimer() for the same OS_TIMER, it could happen that the internal list of timers was corrupted.<br>
            The problem existed in all earlier embOS versions and is fixed with version 4.12a.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.12  [19. Aug 2015]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Support for SYSVIEW API trace added.</li>
          <li>New mailbox API functions OS_Mail_GetPtr(), OS_Mail_GetPtrCond() and OS_Mail_Purge() added.</li>
        </ol>
        <h3>Improvements</h3>
        <ol>
          <li>Percepio embOS-Trace macro in OS_CreateTimerEx() removed.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_Alloc() corrected.<br>
            OS_Alloc() could fail when calling for the first time from more than one task.<br>
            The 2nd task could try to initialize the resource semaphore which was already initialized by the first call of OS_Alloc().<br>
            The problem existed in all earlier embOS versions and is fixed with version 4.12.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.10b  [29. May 2015]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>OS_SendString() parameter declaration modified to avoid compiler warning.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_TerminateTask() corrected.<br>
            This should already be corrected with V3.90a but was actually not.<br>
            Please find more details below in description of V3.90a.</li>
          <li>OS_AdjustTime() corrected.<br>
            embOS usec precise system time could return wrong values when using with embOS tickless mode.<br>
            The problem existed since embOS versions 4.02 and is fixed with version 4.10b.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.10a  [13. May 2015]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>Percepio embOS-Trace defines added.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_GetTime_us() / OS_GetTime_us64() corrected.<br>
            It could happen that OS_GetTime_us() / OS_GetTime_us64() return wrong results when the interrupt pending flag was set during function execution.
            The problem existed since embOS versions 4.02 and is fixed with version 4.10a.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.10  [30. Apr 2015]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>MISRA C:2012 compliance<br>
          embOS is fully MISRA C:2012 compliant. Compliance matrix and deviations are documented in a separate PDF document.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_GetNumIdleTicks() corrected.<br>
            It could happen that OS_GetNumIdleTicks() returns wrong results, e.g. when a software timer was stopped in OS_Idle() before calling OS_GetNumIdleTicks().<br>
            The problem existed since embOS versions 4.00 and is fixed with version 4.10.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.06b  [24. Mar 2015]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>Percepio embOS-Trace macro in OS_TerminateTask() corrected.<br>
            OS_TerminateTask(NULL) reads from address 0x14 which might fail on some CPUs without memory at 0x00.<br>
            The problem existed since embOS versions 4.06 and is fixed with version 4.06b.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.06a  [16. Mar 2015]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>Percepio embOS-Trace macros added/modified.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>Declaration of OS_Counters modified.<br>
            The Region counter is now declared as volatile. Otherwise some compilers with high optimization remove OS_EnterRegion().<br>
            The problem existed in all previous embOS versions and is fixed with version 4.06a.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.06  [12. Mar 2015]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Support for Percepio embOS-Trace added.<br>
          embOS can now be used with the Percepio embOS-Trace application to trace the embOS API and embOS internals.
          </li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_StopTicklessMode() corrected.<br>
            If an interruppt occurred while OS_StopTicklessMode() was executed a NULL function callback pointer could be called.<br>
            The problem existed since embOS versions 4.00a and is fixed with version 4.06.</li><br>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.04a  [01. Dec 2014]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_Config_SysTimer(), OS_GetTime_us() and OS_GetTime_us64() were not included in the embOS built.<br>
            The problem existed since embOS versions 4.04 and is fixed with version 4.04a.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.04  [12. Nov 2014]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Task priorities extended to 32bit on 32bit CPUs.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_SendString() corrected.<br>
            When an interrupt activates another task which also calls OS_SendString() it could happen that a task was not resumed again after it was suspended by OS_SendString().<br>
            The problem existed in all previous embOS versions and is fixed with version 4.04.</li>
          <li>OS_GetTime_us() corrected.<br>
            An internal calculation overflow could cause that not the full 32bit return value range could be used.<br>
            The problem existed since embOS versions 4.02 and is fixed with version 4.04.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.02a  [15. Sep 2014]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>Compile error fixed when disabling embOS tickless feature.<br>
            A compile error occurred when disabling the embOS tickless feature with the compile-time switch OS_SUPPORT_TICKLESS.<br>
            The problem existed since version 4.00 of embOS and is fixed with version 4.02a.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.02  [15. Aug 2014]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New functions OS_GetTime_us(), OS_GetTime_us64() and OS_Config_SysTimer() added.<br>
           OS_GetTime_us() returns the current system time in usec.
          </li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.00a  [21. Jul 2014]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New tickless function OS_StopTicklessMode() added.</li>
          <li>New const variable OS_DebugInfo added.<br>
            This structure includes the field offsets of struct OS_GLOBAL and OS_TASK required by remote debugger for thread-awareness.</li>
          <li>New profiling functions OS_STAT_Enable(), OS_STAT_Disable() and OS_STAT_GetTaskExecTime() added.
            These function can be used to enable/disable the profiling and to get the total execution time of a task.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_SendString() corrected.<br>
            When an interrupt activates a higher priority task which also calls OS_SendString() embOS could stop in an endless loop in OS_SendString().<br>
            The problem existed in all previous embOS versions and is fixed with version 4.00a.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V4.00  [06. Jun 2014]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Tickless support added.<br>
            embOS now supports tickless mode. This is useful for low power operations, e.g. battery powered devices.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.90a  [09. Apr 2014]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_TerminateTask() corrected.<br>
            Terminating a task which was suspended by OS_SendString(), ended in a call of OS_Error() later on when the transmission interrupt of the embOSView communication tried to re-activate the non-existing task.<br>
            OS_TerminateTask() was modified to avoid this problem. When terminating such task, the control variables for embOSView communication are set to not activate that task.<br>
            The problem existed in all previous embOS versions and is fixed with version 3.90a.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.90  [17. Feb 2014]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Functions to enable/disable global interrupts added.<br>
            embOS now offers the following functions to enable and disable all interrupts, including high priority interrupts:<br>
            OS_INTERRUPT_MaskGlobal() OS_INTERRUPT_UnmaskGlobal()<br>
            Using the following functions allows nested calls, because the interrupt state can be saved and restored:<br>
            OS_INTERRUPT_PreserveGlobal() OS_INTERRUPT_PreserveAndMaskGlobal() OS_INTERRUPT_RestoreGlobal()</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.88h  [20. Dec 2013]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_GetNumIdleTicks() added.<br>
           Can be used to examine the number of ticks spent idle.<br>
           This is the number ticks until the next time scheduled action will be started.</li>
          <li>OS_AdjustTime() added.
            Can be used to add an amount of time to the embOS internal time variable.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.88g  [30. Oct 2013]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_Q_Clear() corrected.<br>
            OS_Q_Clear() did not activate tasks which were waiting on the queue.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.88f  [22. Sep 2013]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>Internal const variable definition corrected.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.88e  [06. Sep 2013]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>Assertion into OS_Delayus() added.<br>
            The assertion checks if interrupts are enabled before calling this function.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>Internal function prototype corrected.<br>
            Function prototype in trace modul corrected.<br>
            With the incorrect function prototype some embOS ports did not build without compiler error.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.88d  [04. Sep 2013]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Compatibility macros to older versions added.<br>
            In version 3.88c, some compatibility macros to address internal variables were removed from RTOS.h.<br>
            With version 3.88d, the following macros are available again:<br>
            OS_pTask, OS_pCurrentTask, OS_pActiveTask, OS_pTimer, OS_pCurrentTimer, OS_Counters, OS_Pending, OS_TimeDex</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>Compatibility macros to older versions added.<br>
            In version 3.88c, some compatibility macros to address internal veriables were removed from RTOS.h.<br>
            With version 3.88d, the following macros are available again:<br>
            OS_pTask, OS_pCurrentTask, OS_pActiveTask, OS_pTimer, OS_pCurrentTimer, OS_Counters, OS_Pending, OS_TimeDex</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.88c  [08. Aug 2013]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New API function OS_InInterrupt().<br>
            The new API function OS_InInterrupt() can be used to examine if the calling function is running in an embOS interrupt handler.<br>
            The function is available in all library modes.</li>
          <li>New API function OS_Q_PutTimed().<br>
            The new function OS_Q_PutTimed() can be used to put data into a queue with a given timeout.<br>
            The function suspends the calling task for the given timeout if no space for the message is avaialable in the queue.</li>
          <li>New profiling functions to measure CPU load at runtime.<br>
            The new functions OS_AddLoadMeasurement(), OS_GetLoadMeasurement() and OS_INC_IDLE_CNT() can be used to examine the total CPU load at runtime.<br>
            The measurement period can be set by function, the global variable OC_CPU_Load can be read by debuggers with life watch capability.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.88b  [28. May 2013]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>Internal data structure changed to efficiently access embOS version.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.88a  [02. May 2013]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Reset behaviour of OS_EVENT objects can be controlled.<br>
            The new API function OS_EVENT_SetResetMode() allows setting of the reset behaviour of existing event objects.<br>
            The embOS functions for event objects unfortunately were inconsistent in respect of the reset behaviour of events.<br>
            Setting the reset mode with the new function OS_EVENT_SetResetMode() allows to set the reset behaviour to semiauto, manual, or automatic reset.<br>
            Manual reset guaranties that the event object remains set when waiting tasks are resumed. The event has to be reset manually by the task.<br>
            Automatic reset allways resets the event when waiting tasks are resumed. The task does not need to reset the event.<br>
            The semiauto mode is the mode used in previous versions of embOS as described in the manual.</li>
          <li>New extended function for event object creation.<br>
            The new function OS_EVENT_CreateEx() allows to create an event object and set the reset behavior to semiauto, manual or automatic reset.</li>
          <li>Type of reset behaviour of event objects can be retrieved.<br>
            The new function OS_EVENT_GetResetMode() retrieves the current setting of the reset behaviour of an event object.</li>
          <li>Message size for mailboxes enlarged.<br>
            Previous version of embOS allowed message sizes of up to 127 bytes for mailboxes.<br>
            Now embOS allows messages sizes of up to 32767 bytes for mailboxes.<br>
            However, the total size of one mailbox buffer is still limited to 64KBytes on 16bit CPUs.<br>
            The debug builds of embOS now call OS_Error() with error code OS_ERR_MB_BUFFER_SIZE if the total size limit of one mailbox buffer is exceeded when calling OS_CreateMB().</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>embOS software timer handling corrected.<br>
            During software timer handling, a NULL-pointer might have been de-referenced.<br>
            On targets with MMU, this caused an exception when memory at address 0x0 was not enabled.<br>
            The problem existed since version 3.86g of embOS and is fixed with version 3.86n.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.88  [19. Feb 2013]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Fully tested with Parasoft C/C++test MISRA check.<br>
            MISRA violations suppressed in source code with Parasoft comments.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.86n  [07. Dec 2012]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>embOS heap management functions corrected.<br>
            Locking the heap by a resource semaphore must not be controlled by OS_IsRunning(). The previous implementation did not use (and initialize) the semaphore as long as embOS was not started.<br>
            This caused a problem when data was allocated during main(), without semaphore, but released from a task, which then addressed the semaphore which did not exist.<br>
            When OS_malloc() was not called from main(), the problem did not occur.<br>
            The problem existed since version 3.86e of embOS and is fixed with version 3.86n.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.86m  [05. Dec 2012]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>embOS scheduler corrected.<br>
            The scheduler failed when a task which was suspended and on timeout reached its timeout and at the same moment during execution of the scheduler, a higher priority task was activated by an interrupt.<br>
            The higher priority task was put in ready state, but was not started.<br>
            The problem existed in all previous embOS versions and is fixed with version 3.86m.</li>
          <li>OS_TerminateTask() corrected.<br>
            Setting OS_pActiveTask, the pointer to the task to activate next, has to be an atomic operation.<br>
            To ensure atomic operation, interrupts have to be disabled before setting OS_pActiveTask when OS_PTR_OP_IS_ATOMIC is defined to 0. This was not handled correctly in previous versions of embOS and might have caused problems with CPUs which can not write pointer values as atomic operation. Most likely, all 32bit CPUs can write a pointer value as an atomic operation. The problem might have occurred on those 16- or 8-bit CPUs which can not. The problem is fixed with version 3.86m.</li>
          <li>Internal function OS_InsertTask() corrected. Insertion of a task into the linked list of tasks has to use atomic operations, when the next pointer of the previous task is updated to point to the new task that shall be inserted.<br>
            The corrected version disables interrupts before the next pointer of the previous task is updated, when OS_PTR_OP_IS_ATOMIC is defined to 0.<br>
            This was not handled correctly in previous versions of embOS and might have caused problems with CPUs which can not write pointer values as atomic operation, when tasks were created dynamically when embOS was already started, or OS_SetPriority() was called after starting embOS. Most likely, all 32bit CPUs can write a pointer value as an atomic operation. The problem might have occurred on those 16- or 8-bit CPUs which can not. The internal function OS_InsertTask() is called during task creation or OS_SetPriority().</li>
          <li>Definition of OS_VERSION corrected. The definition of OS_VERSION was modified with version 3.86l of embOS to comply to MISRA rules.<br>
            As long as OS_VERSION was used internally in embOS, no problem occurred.<br>
            Unfortunately, when user software tried to evaluate OS_VERSION for comparison, the expression could not be evaluated, compilation stopped with errors. The problem exsisted in version 3.86l of embOS only and is fixed with version 3.86m.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.86l  [21. Nov 2012]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>MISRA rule compliance improved.<br>
            All violations of MISRA rule 10.1 fixed.<br>
            All violations of MISRA rule 12.7 fixed.<br>
            All violations of MISRA rule 14.9 fixed.<br>
            All violations of MISRA rule 16.4 fixed.<br>
            All violations of MISRA rule 16.8 fixed.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>Assertions in OS_AddTickHook() corrected.<br>
            The function OS_AddTickHook() must not be called from interrupt handlers. It may be called from main() or tasks only.<br>
            Previuos versions of embOS did not detect when this function was called from an ISR.<br>
            With embOS version V3.86l, OS_Error() is called in debug builds when the function is called from an ISR handler.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.86k  [02. Oct 2012]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New embOS API functions OS_Q_GetMessageSize() and OS_Q_PeekPtr().<br>
            The new function OS_Q_GetMessageSize() reads the size of the first message in a queue.<br>
            The new function OS_Q_PeekPtr() reads a message from a queue without removing it.</li>
          <li>embOS is now compliant to MISRA 2004 rules.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.86i  [26. Sep 2012]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_EnterNestableInterrupt() modified.<br>
            When embOS was compiled with optimization using IAR RX compiler the execution of the incrementation of region counter was delayed in OS_EnterNestableInterrupt().<br>
            The new macro OS_IntEnterRegion is now used in OS_EnterNestableInterrupt().<br>
            This macro can be overwritten in the cpu/compiler specific header file with OS_EnterRegionFunc() to avoid that interrupts are enabled before the region counter is incremented.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.86h  [06. Sep 2012]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_EVENT handling with timeout corrected.<br>
            Previous versions of embOS lost an event when tasks were waiting on the event by a all of OS_EVENT_WaitTimed() and the event was signaled after the timeout expired.<br>
            When the waiting tasks were not activated by the scheduler when the timeout expired, which might have happened, when an other task ran in a critical region, a following call of OS_EVENT_Set() did not signal the event, so the event got lost.<br>
            The waiting tasks reported a timeout when they continued execution.<br>
            The problem existed in all revious versions of embOS and is fixed with version 3.86h.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.86g  [04. Aug 2012]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_RetriggerTimer() corrected.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.86f  [25. Jul 2012]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Task events default to 32bit on 32bit CPUs.<br>
            The default for task events for 32bit CPUs was modified from unsigned char to unsigned long.<br>
            On 32bit CPUs, now the type OS_TASK_EVENT is defined as OS_U32 per default, allowing 32 different task events.<br>
            All previous versions limited the task events for all CPUs to 8bit per default.</li>
          <li>OS_ON_TERMINATE_HOOK added.<br>
            embOS now supports a linked list of functions which are called when a task is terminated.<br>
            The new embOS function OS_AddOnTerminateHook() can be used to insert a callback function in the list of functions which are called when a task is terminated.<br>
            The callback function gets the task ID as paramter.<br>
            The callback function can be used to free or remove task specific objects which were created by the application.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_ERR_TIMESLICE removed.<br>
            Previous versions of embOS called the error handler OS_Error() with error code OS_ERR_TIMESLICE, when a task with a timeslice value of 0 was created.<br>
            Now, a timeslice value of zero is legal. It allows pure cooperative scheduling between tasks with th esame priority as described in the generic manual, chapter 4.<br>
            The OS_ERR_TIMESLICE assertion was introduced with embOS version 3.82n and is removed with version 3.86f.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.86e  [29. May 2012]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>OS_malloc(), OS_free(), OS_realloc() modified.<br>
            To allow thread safe heap management, OS_malloc() creates or uses a semaphore when called.<br>
            The new versions of OS_malloc(), OS_free() and OS_realloc() use the semaphore when called from tasks only. The semaphore is not needed, before embOS is started.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>Stack info functions for release build corrected.<br>
            The API function macros were not defined properly in the release build.<br>
            When used in an application with relase build, the following functions generated compiler errors and could not be used: <br>
            OS_GetSysStackBase()<br>
            OS_GetSysStackSize()<br>
            OS_GetSysStackSpace()<br>
            OS_GetSysStackUsed()<br>
            OS_GetIntStackBase()<br>
            OS_GetIntStackSize()<br>
            OS_GetIntStackSpace()<br>
            OS_GetIntStackUsed()<br>
            The problem existed since embOS version 3.84 and is fixed with version 3.86e</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.86d  [9. May 2012 ]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>Timeout handling for waitable objects corrected.<br>
            When the timeout had already expired when the wait function with timeout was called, the function came back with interrupts disabled. This might have happened when other tasks with higher priority or interrupts blocked the calling task right after calling a wait functing. The application might have been kept blocked for ever when the calling task did not call any other function which re-enabled interrupts by OS_RestoreI(). The problem existed in embOS versions since version 3.86 and is fixed with version 3.86d.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.86c  [8. May 2012 ]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>Missing prototype for OS_EnterRegionFunc() added.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.86b  [2. May 2012 ]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New embOS API function OS_PeekMail().<br>
            The new function OS_PeekMail() reads a mail from a mailbox without removing it.</li>
        </ol>
        <h3>Improvements</h3>
        <ol>
          <li>Several macro definitions in RTOS.h modified to be compliant to MISRA rules.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.86a  [30. Apr 2012]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>Queue handling corrected.<br>
            When OS_Q_PutBlocked() was used in an application, OS_Purge() called from a lower priority task might have ended in an endless loop.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.86   [22. Mar 2012]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Timeout handling for "waitable" objects modified.<br>
            Previous versions of timed wait functions for waitable objects might have returned with no timeout condition when the object became avaialble after the timeout time.<br>
            This happened when the waiting task was blocked by higher priority tasks and did not start after the timeout period.<br>
            When the object became availabel after expiration of the timeout time but before the waiting tasks started again, no timeout condition was signaled to the task.<br>
            This behaviour is changed with version 3.86 of embOS. When the object was not avaialble within the timeout time, a timeout is signaled to the waiting task, regardless the object may become avaialble until the task runs again.<br>
            Following functions were modified:<br>
            OS_EVENT_WaitTimed()<br>
            OS_GetMailTimed()<br>
            OS_MEMF_AllocTimed()<br>
            OS_Q_GetPtrTimed()<br>
            OS_UseTimed()<br>
            OS_WaitCSemaTimed()<br>
            OS_WaitMailTimed()</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>Support for task events with timeout corrected.<br>
            Previous versions of the functions OS_WaitEventTimed() and OS_WaitSingleEventTimed() limited the number of task events to 8, even when the definition of the type OS_TASK_EVENT was defined to a larger data type.<br>
            Because of an error in an internal function, task events were truncated to 8 bit, regardless the definition of OS_TASK_EVENT.<br>
            The problem existed in all previous versions of embOS and is fixed with version 3.86</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.84c  [05. Jan 2012]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_Q_Put() corrected.<br>
            OS_Q_Put() existed twice in embOS generic sources V3.84b.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.84b  [21. Dec 2011]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New embOS API function OS_Q_PutBlocked().<br>
            The new blocking function for Queues OS_Q_PutBlocked() suspends the task when the queue is full.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.84a  [22. Nov 2011]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>OSInfo now checks if OS_CPU is defined.<br>
            When compiling sources, the value of OS_CPU is now checked and has to be defined, it should not be empty.<br>
            The value of OS_CPU reflects the CPU variant which was selected to build the embOS library and is shown in the system information window when using embOSView.<br>
            Previous versions of embOS did not check if this value was defined.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.84  [27. Sep 2011]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New system stack check functions.<br>
            New functions to analyze the system stack load during runtime are available now:<br>
            OS_GetSysStackBase() delivers the base address of the system stack.<br>
            OS_GetSysStackSize() delivers the size of the system stack.<br>
            OS_GetSysStackSpace() delivers the free (unused) space on the system stack.<br>
            OS_GetSysStackUsed() delivers the maximum amount of stack space used on the system stack.</li>
          <li>New interrupt stack check functions.<br>
            For CPUs which support a separate interrupt stack, new functions to analyze the interrupt stack load during runtime are available now:<br>
            OS_GetIntStackBase() delivers the base address of the interrupt stack.<br>
            OS_GetIntStackSize() delivers the size of the interrupt stack.<br>
            OS_GetIntStackSpace() delivers the free (unused) space on the interrupt stack.<br>
            OS_GetIntStackUsed() delivers the maximum amount of stack space used on the interrupt stack.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82x  [12. Sep 2011]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_RegionCnt overflow check added.<br>
            Overflow check is activated when OS_DEBUG_LEVEL >= 2.</li>
          <li>Macro OS_EnterInterrupt() modified.<br>
            OS_ASSERT_CPU_IN_ISR_MODE() moved to first line in macro OS_EnterInterrupt().</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82w  [10. Aug 2011]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>GCC compiler warning eliminated.<br>
            GCC compiler warning in OS_MEMF_Create.c eliminated.</li>
          <li>Code modified for Lint.<br>
            All embOS generic sources are tested with Lint.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>Resource semaphore handling corrected.<br>
            On 8 or 16 bit CPUs with high interrupt load, the scheduler might have failed when an interrupt occurred during a resource semaphore with waiting tasks was released by a call of OS_Unuse().<br>
            This happened on CPUs which could not perform atomic pointer or 32bit operations.<br>
            The system might have crashed, or might not have activated tasks with higher priority.<br>
            The problem existed in all embOS versions since version 3.80i and is corrected with version 3.82w.<br>
            Usage of OS_UseTimed() might have caused the same problems on all CPUs when the timeout expired during the resource semaphore was freed and waiting tasks were activated from another task by calling OS_Unuse().</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82v  [15. Jul 2011]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>OS_Terminate() renamed to OS_TerminateTask().</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82u  [25. May 2011]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Fixed size memory blocks may be larger than 64KB on 32bit CPUs.<br>
            The fixed size memory pool data types were modified to allow larger pools and block sizes on 32bit CPUs. The sizes may now be up to 2^31 bytes.<br>
            For 16bit CPUs the block and pool sizes remain unchanged to previous versions and may be 64KB.</li>
          <li>Software timer handling can be excluded.<br>
            The new compile-time switch OS_SUPPORT_TIMER may be used to exclude embOS software timer handling from build when compiling the sources.<br>
            If software timer are not needed by the application, excluding the software timer handling will decrease code and data size and speed up the scheduler.</li>
        </ol>
        <h3>Improvements</h3>
        <ol>
          <li>Software timer handling optimized.<br>
            The software timer handler was removed form the scheduler and put into a separate module.<br>
            If software timer are not used by the application, the software timer handler will not be linked in, thus reducing the required kernel code size.</li>
          <li>Generic timer tick handler modified.<br>
            The preprocessor conditional defines which guarantee safe code for processors which can not perform atomic 32bit calculations or pointer operations was modifed.<br>
            This is an internal modification which has no effect on any current embOS port.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82t  [03. May 2011]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Trial time limitation increased to 12 hours.
            The trial time limitation is increased from 15 minutes to 12 hours.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82s  [18. Mar 2011]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New API function OS_UseTimed().<br>
            OS_UseTimed() may be used to request a resource semaphore with time out. The function blocks until the resource is available or the timeout expired.</li>
        </ol>
        <h3>Improvements</h3>
        <ol>
          <li>Nestable interrupt handling improved.<br>
            Some embOS functions might have inhibited re-enabling of interrupts when a nestable interrupt was called during task suspension caused by the function.<br>
            The following API functions were affected and have been modified to correct this behavior:<br>
            OS_WaitEvent()<br>
            OS_WaitEventTimed()<br>
            OS_WaitSingleEvent()<br>
            OS_WaitSingelEventTimed()<br>
            OS_MEMF_AllocTimed()<br>
            OS_Yield()</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_WaitCSemaTimed() corrected.<br>
            The function might have blocked a task longer than expected.<br>
            This happened when the task was restarted during the timeout by a semaphore signal and the semaphore was not available for the task, because it was claimed by a higher prioritized task during task activation.<br>
            In this case, the task was suspended again with the initial full timeout value.<br>
            The problem existed in all previous versions fo embOS and is corrected with version 3.82s.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82r  [28. Jan 2011]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>Thread local storage handling improved.<br>
            For embOS ports which support thread local storage, the task switch time was slightly increased, even for tasks which did not use thread local storage.<br>
            The implementation of thread local storage now is improved and does not affect the context switch time of tasks which do not use thread local storage.</li>
          <li>OS_TLS_Init() contains a new assertion.<br>
            OS_TLS_Init() must not be called multiple times from the same task.<br>
            In debug builds of embOS, the new implementation of OS_TLS_Int() now calls the OS_Error() function with error code OS_ERR_TLS_INIT when OS_TLS_Init() is called multiple times from the same task.</li>
          <li>OS_Terminate() contains a new assertion.<br>
            OS_Terminate() must not be called from an embOS software timer callback function.<br>
            In debug builds of embOS, the new implementation of OS_Terminate() now calls the OS_Error() function with error code OS_ERR_ILLEGAL_IN_TIMER when OS_Terminate() is called from an embOS timer.</li>
          <li>OS_ExtendTaskContext() contains a new assertion.<br>
            For every task, the context can be extended only once.<br>
            In debug builds of embOS, the new implementation of OS_ExtendTaskContext() now calls the OS_Error() function with the new error code OS_ERR_EXTEND_CONTEXT when OS_ExtendTaskContext() is called multiple times from the same task.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82q  [18. Jan 2011]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>OS_EnterNestableInterrupt() optimized to reduce interrupt latency.<br>
            OS_EnterNestableInterrupt() caused some interrupt latency for zero latency interrupts when an embOS debug library was used.<br>
            Only CPUs which disable interrupts on interrupt entry were affected, for example Renesas M16C / M32C.<br>
            OS_EnterNestableInterrupt() for those CPUs was optimized to reduce the interrupt latency of high priority interrupts.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82p  [12. Jan 2011]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>OS_Suspend() now contains an assertion.<br>
            OS_Suspend() must not be called from an interrupt handler as it could cause a task switch immediately.<br>
            In debug versions of embOS, OS_Suspend() now runs into OS_Error() if called from an interrupt handler or timer.</li>
          <li>OS_PutMail functions parameter declaration changed.<br>
            The functions OS_Putmail(), OS_PutMailCond, OS_PutMailFront() and OS_PutMailFrontCond() now have a const pointer qualifier for the data that shall be put into the mailbox.<br>
            The const qualifier clarifies and ensures that the data is not modifed by the function.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82o  [04. Jan 2011]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New API function OS_WaitMailTimed().<br>
           OS_WaitMailTimed() may be used to suspend a task for a given timeout or until a message is available in a mailbox without retrieving the mail.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82n  [06. Dec 2010]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New API functions for task suspension and synchronization.<br>
            OS_SuspendAllTasks() may be used to suspend all task except the running task.<br>
            OS_SetInitialSuspendCnt() can be used to create tasks that are initially suspended and will not run until they are resumed.<br>
            OS_ResumAllSuspendedTasks() may be used to resume all suspended task at once without the need to address specific tasks.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82m  [16. Nov 2010]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>Queue management corrected.<br>
            Queue management failed when the Q-buffer was filled up to the end. This might have happened, when messages are produced faster then they were consumed.<br>
            The OS_Q_Purge() and OS_Q_Put() functions did not handle this case correctly and caused the queue to be corrupted.<br>
            OS_Error() might have been called with error number 143, or OS_Q_GetPtr() might have returned with a wrong message size or a message size of 0.<br>
            The problem existed since version 3.82k of embOS and is fixed with version 3.82m.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82l  [26. Oct 2010]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Thread local storage supported.<br>
            For some ports, a thread local storage (TLS) may be used and can be initialized individually for every task by a call of OS_TLS_Init().<br>
            The new TLS implementation requires additional CPU specifc fucntions and support by the compiler specific runtime library, it may be available for some ports only.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82k  [21. Sep 2010]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New API function OS_Delayus().<br>
            The new function OS_Delayus() can be used to perform a delay with micro second resolution. The calling task will wait for the given delay time without suspension.<br>
            During the wait time, other tasks may be activated by interrupt, the embOS scheduling is not blocked.<br>
            The function works well when the embOS timer has a resolution of at least 1us or better.</li>
          <li>New API function OS_Q_Delete().<br>
            This new function deletes a queue. Queues can be fully dynamically created and deleted now. The resources of the queue may be re-used after deletion.</li>
        </ol>
        <h3>Improvements</h3>
        <ol>
          <li>Queue management optimized.<br>
            Previous versions of embOS needed 2 integer words of mamangement information stored into the queue buffer for every data item in the queue.<br>
            With verion 3.82k, the data management was optimized and only one additional integer word, the data size, is stored into the buffer together with the data.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>Queue management corrected.<br>
            Queue mamagement failed when multiple producer put data into the same queue and one of the producer was an ISR handler.<br>
            When the ISR handler was called during a running transfer into the queue, the data in the queue could be corrupted.<br>
            The problem existed in all previous versions of embOS and is fixed with version 3.82k.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82i  [26. Jul 2010]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>OS_StartTimer() modified to avoid warnings under GCC when compiling sources.<br>
            When compiling sources with optimization under GCC, the code in OS_StartTimer() generated a "strict alias violation" warning.<br>
            Some casts were removed and one pointer type was modified to eliminate this warning.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82h  [28. May 2010]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Internal data types modified.<br>
            A data type was defined for Ipl_EI and Ipl_DI. This allows variable size of integers which is supported by some tool chains.</li>
          <li>OS_Info module modifed.<br>
            The OS_Info module included the standard header stdio.h without any need. The include is removed now.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82g  [12. May 2010]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_Start() in assembly source replaced by OS_StartASM().<br>
            OS_Start() now is a generic function which sets OS_Running to 1 and then calls OS_StartASM().</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82f  [16. Apr 2010]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_IsRunning() implemented.<br>
            The new API function OS_IsRunning() can be used to examine whether the embOS scheduler was started by a call of OS_Start().<br>
            This may be helpful for some applications and functions to decide whether blocking function calls can be used.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82e  [17. Dec 2009]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>Stack overflow check for system stack and interrupt stack added.<br>
            In stack check builds, embOS now checks the system stack and the interrupt stack (if present) during every call of the scheduler.<br>
            If a stack overflow is detected, the error handler OS_Error() is called with one of the new error codes OS_ERR_SYS_STACK or OS_ERR_INT_STACK.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82d  [16. Dec 2009]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>Variable type changed to avoid GCC warnings.</li>
          <li>Changes in OS_Global initialization to avoid GCC warnings.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82c  [18. Nov 2009]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>Initialization of OS_Global in OSGlobal.c changed to avoid GCC warnings.</li>
          <li>The definition OS_MODEL was moved from OS_RAW.h to OSINFO.c because CPU name and library name will now be placed in OS_Priv.h.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82b  [28. Oct 2009]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>Communication functions for embOSView may be used from tasks.<br>
            The embOS internal communication functions for embOSView, OS_OnRx() and OS_OnTx() may now be called from a task.<br>
            Previous versions of embOS did not allow calling these functions from outside an interrupt handler and called OS_Error() in debug builds.<br>
            Right now, theses functions and the communication protocol are not documented. The user should not call these functions.<br>
            The modification was done for future extensions.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82a  [25. Sep 2009]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Error handling for queues implemented.<br>
            embOS checks in debug version the correct queue handling.</li>
          <li>OS_Q_IsInUse() implemented.<br>
            New queue function which returns whether the queue is currently in use.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.82  [17. Sep 2009]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Scheduling and task switch time optimized.<br>
            The internal scheduling functions OS_ChangeTask() and OS_Switch() were optimized to speed up context switching.<br>
            By recompiling the sources, the optimization may be enabled or disabled by the definition of OS_GLOBAL_IS_RETURNED and OS_GLOBAL_IS_PARA.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.80l  [07. Sep 2009]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Macro OS_U32_TO_PTR_TYPE added.<br>
            The new macro OS_U32_TO_PTR_TYPE casts an OS_U32 to pointer type to avoid warnings on some tool chains with different memory models.</li>
          <li>New macro OS_EI_HP_ON_ENTRY()<br>
            OS_EI_HP_ON_ENTRY() enables high-prio interrupts if necessary: Some CPUs (such as M16C) disable all interrupts on ISR entry.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.80k  [02. Sep 2009]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>New fast tick handler.<br>
            embOS V3.80k comes with an alternate faster tick handler OS_TICK_HandleNoHook().<br>
            This tick handler does not support the tick hook function and therefore executes faster.<br>
            It may be used instead of the regular tick handler OS_TICK_Handle() which is used in the default start projects.<br>
            When using this new fast tick handler, it is the users responsibility, not to install any tick hook functions, as those will not be called by embOS.</li>
          <li>Task events modified.<br>
            The data type of task events may now be modified from unsigned char to unsigned short or unsigned int to allow more than 8 task events.<br>
            The modification is done be defining the type of task events via the OS_TASK_EVENT definition in RTOS.h<br>
            This type defaults to unsigned char to be compatible with previous versions of embOS. A modification requires recompilation of the embOS sources.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>Trace functions corrected.<br>
            The previous version of embOS intoduced a bug in the trace module. Task names were not shown and the task sensitive filter did not work.<br>
            The problem existed in version 3.80i in trace libaries only and is corrected in version 3.80k.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.80i  [11. Aug 2009]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>Resource semaphore handling speed optimized.<br>
            OS_Use() and OS_Unuse() were optimized to allow faster locking and unlocking on rersource semaphores.<br>
            The embOS scheduler was optimized to allow faster activation of tasks waiting on resources semaphores.</li>
          <li>Support for CPUs with growing stack addresses supported.<br>
            To handle CPUs with growing stack addresses, OS_CreateTask() and OS_CreateTaskEx() were modified. The compile time switch OS_STACK_AT_BOTTOM is now honored by these functions and stack is handled correctly for those CPUs.<br>
            Existing embOS version are not affected, this modification was made for newer versions for CPUs with growing stack addresses.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.80h  [27. Jul 2009]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Interrupt entry functions modified, internal modification.<br>
            For some CPUs the CPU state can not be examined. A modification of the interrupt entry functions was required to inhibit an interrupt level assertion, introduced with version 3.80f, for those CPUs.<br>
            The performance is not affected by this modification.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.80g  [05. Jun 2009]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>embOS internal semaphores can be shown with the embOS plugin for IAR C-Spy.<br>
            The embOS plugin for IAR did not show the system locking semaphores used for malloc and other non re-entrant system functions when no other resource semaphores were used in the application.<br>
            These semaphores can be now be seen in the Resource semaphore window of the embOS C-Spy plugin.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.80f  [03. Jun 2009]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Interrupt level assertions added.<br>
            The debug version of embOS now comes with additional error handler functionality.<br>
            The error handler can detect illegal function calls under various conditions. OS_Error() will be called when one of the following conditions is detected:<br>
            OS_ERR_NOT_IN_ISR: *** OS_EnterInterrupt() has been called, but CPU is not in ISR state<br>
            OS_ERR_IN_ISR: *** OS_EnterInterrupt() has not been called, but CPU is in ISR state<br>
            OS_ERR_CPU_STATE_ISR_ILLEGAL: *** OS-function called from ISR with high priority<br>
            OS_ERR_CPU_STATE_ILLEGAL: *** CPU runs in illegal mode<br>
            OS_ERR_CPU_STATE_UNKNOWN: *** CPU runs in unknown mode or mode could not be read</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.80  [14. Nov 2008]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>OS_Suspend() / OS_Resume() optimized.<br>
            The OS_Suspend() and OS_Resume() functions were optimized to perform faster task switches on 32bit CPUs.</li>
          <li>Internal data structures and scheduler optimized.<br>
            Internal data structures were modified to allow more efficient access. Together with a modification of the scheduler, this results in faster task switches and interrupt handling.</li>
          <li>OS_InitKern() does not enable interrupts.<br>
            The previous OS_InitKern() function enabled interrupts by a call of OS_RestoreI(), thus enabling interrupts, as long as OS_IncDI() was not called before.<br>
            The new OS_InitKern() function does not automatically enable interrupts. The interrupt enable state remains unchanged.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.62c  [24. Oct 2008]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>New error code OS_ERR_IDLE_RETURNS.<br>
            The debug version of embOS now checks whether OS_Idle() returns in which case OS_Error() is called with the new error code.<br>
            OS_Idle() has to be implemented as an endless loop and must never return. If OS_Idle() is modified and returns by accident, the behavior is unpredictable and this error might be difficult to find.<br>
            The new version of embOS now catches a return from OS_Idle() and calls OS_Error().</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_GetPriority() corrected.<br>
            In OS_GetPriority() was called with NULL as paramter, the debug version of embOS called OS_Error() with error code OS_TASK_INV.<br>
            The NULL pointer is allowed now and the function delivers the priority of the running task as described in the documentation.<br>
            This error existed in all previous versions of embOS and is fixed with version 3.62c.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.62b  [10. Oct 2008]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>New error code OS_ERR_ISR_NO_HANDLER.<br>
            The new error code is generated and OS_Error() is called, if an un-initialized interrupt handler is called.<br>
            This error handling is available on some ports of embOS, especially those, where embOS initializes an interrupt vector table in RAM.<br>
            During initialization, a default dummy handler is installed for all interrupt sources. This handler should normally be replaced by installing application specific interrupt handlers.<br>
            Because the default dummy interrupt handler should never be called by an application, it calls OS_Error() with the new error code OS_ERR_ISR_NO_HANDLER to signal the setup error.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.62a  [06. Oct 2008]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_STACK_ALIGN implemented.<br>
            OS_STACK_ALIGN may be defined to ensure a specific task stack alignment during task creation.<br>
            To ensure a stack alignment of 8 bytes, OS_STACK_ALIGN has to be defined to 8 in the CPU specific embOS internal header file OS_Priv.h.<br>
            Modification of this define requires recompilation of the embOS libraries.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.62  [01. Sep 2008]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_TICK_Config() and OS_TICK_HandleEx() implemented.<br>
            The extended embOS tick handler was modified to handle a runtime configurable tick increment and fractions.<br>
            These parameter are setup by the new OS_TICK_Config() function and may be re configured during runtime.</li>
        </ol>
        <h3>Improvements</h3>
        <ol>
          <li>Internal representation of scheduler states modified.<br>
            The states which control pending task switches and show the reason of the task switch are handled in compact structure now.<br>
            The previous version used bit fields and definitions which were difficult to understand and which were difficult to handle.<br>
            The new definition and structure is easier to handle which results in faster code execution.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.60e  [25. Aug 2008]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>OS_ERR_WRONG_STACK error code added.<br>
            Some ports of embOS for CPUs with different stack pointers require that the CPU enters main() with a specific stack selected.<br>
            These ports of embOS now contain code to examine the stack used in main and call OS_error() with the new error code OS_ERR_WRON_STACK, if the startup code entered main with the wrong stack-pointer selected.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_EVENT_Create() corrected.<br>
            OS_EVENT_Create() might have called the error-handler OS_Error() with errorcode OS_ERR_2USE_EVENTOBJ if an event-object was created dynamically or as a local object in a function.<br>
            This happened, if the un-initialized data area of the event object contained one specific byte (id code) of the event object.<br>
            The problem existed in all previous embOS versions and is fixed with version 3.60e.</li>
          <li>embOSView corrected.<br>
            When the update interval of embOSView was set to 200ms or a longer value, the reaction of user input or mouse events was blocked for the same time.<br>
            The problem existed since version 3.32 of embOSView and is fixed with version 3.52b.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.60d  [28. Mai 2008]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_POWER module implemented.<br>
            The OS_POWER module may be used to control different power saving modes when entering idle state.<br>
            Individual flags for different peripherals may be set whenever a peripheral needs power or clock, and may be reset, when power is not needed.<br>
            The state of the power flags may be examined during OS_Idle by a call of OS_POWER_GetMask().<br>
            This allows to switch off all of those peripherals which are not needed during idle times.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.60c  [24. Apr 2008]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>OS_ASSERT_INIT_CALLED()<br>
            A new assertion is added which checks whether OS_InitKern() was called before tasks are created.<br>
            In debug builds, the OS_Error() function will be called, if tasks are created before calling OS_InitKern().</li>
          <li>OS_GetTaskName() modified.<br>
            In previous versions, OS_GetTaskName() had to be called with a valid task ID. Now, the NULL pointer may be passed as argument to address the current task.<br>
            The function will always return a valid string.<br>
            The previous implementation might have returned a NULL pointer, which could cause problems, if the result was not evaluated be the calling function.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.60b  [25. Jan 2008]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>OS_ASSERT_ISR_LEVEL()<br>
            A new assertion was defined which will call OS_Error() if the CPU runs in interrupt mode but OS_EnterInterrupt() or OS_EnterNestableInterrupt() was not called.<br>
            With version 3.60b the assertion is not implemented, it is just defined and usage is prepared. The implementation will be made in future versions of embOS.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.60a  [25. Jan 2008]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>embOS trial versions may run an unlimited number of tasks.<br>
            The embOS trial versions run unlimited as long as only 3 tasks are created.<br>
            Since version 3.60a, a time limit is added to the trial version. During the first 15 minutes, an unlimited number of tasks can be created.<br>
            If more than three tasks were created during the time limit time, the system stops and calls OS_Error() when the time limit exceeded.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.60  [18. Nov 2007]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_AddTickHook() and OS_RemoveTickHook() implemented.<br>
            These new functions allow the application to add and remove user function calls (hook functions) to the OS timer tick handler.</li>
        </ol>
        <h3>Improvements</h3>
        <ol>
          <li>OS_GetVersion() implemented as function.<br>
            OS_GetVersion() may be used by the application to retrieve the embOS library version. The result may be used to verify whether the library version matches the embOS header file RTOS.h.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.52e  [12. Nov 2007]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>All embOS variables located in one module.<br>
            All embOS variables are located in one module now. In previous versions of embOS, some module specific embOS variables were located in the module they were used for.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.52c  [17. Oct 2007]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_SetTaskName() introduced.<br>
            OS_SetTaskName() allows modification of task names on the fly.<br>
            This may be useful if the functionality of a task changes during runtime and the new state should be shown using embOSView or an other task visualization tool.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.52b  [05. Sep 2007]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_SendString() corrected.<br>
            When sending an empty string, the calling task was suspended forever.<br>
            The problem existed in all previous embOS versions and is fixed with version 3.52b.</li>
          <li>embOSView corrected.<br>
            When the update interval of embOSView was set to 200ms or a longer value, the reaction of user input or mouse events was blocked for the same time.<br>
            The problem existed since version 3.32 of embOSView and is fixed with version 3.52b.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.52a  [03. Sep 2007]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_Terminate() for XR-build corrected.<br>
            OS_Terminate() in XR-builds might have failed and the system stuck in an endless loop.<br>
            All other library modes were not affected.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.52  [17. Aug 2007]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_CallISR() and OS_CallNestableISR() introduced.<br>
            These new functions are required for some specific CPUs, but may be used in general to call an interrupt handler function without the need of using OS_EnterInterrupt() / OS_LeaveInterrupt() in the handler function.</li>
        </ol>
        <h3>Improvements</h3>
        <ol>
          <li>OS_TickHandler() and OS_TickHandler_Ex() removed.<br>
            These two functions are obsolete, because they can be replaced by OS_HandleTick() and OS_HandleTick_EX(), if OS_EnterInterrupt() / OS_LeaveInterrupt is used in the interrupt handler.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.50c  [10. Aug 2007]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_GetTime32() optimized for 32bit CPUs.<br>
            For 32bit CPUs, OS_GetTime32() is now automatically replaced by an efficient macro which delivers value of the embOS internal time variable.<br>
            In previous versions of embOS, a function was called, when it was not over-written in the CPU specific part of the OS header file.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.50b  [16. Jul 2007]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New library mode XR allows extremely compact applications.<br>
            The new XR libraries may be used to build extremely compact applications to save space in RAM and ROM and speed up context switching time.<br>
            The XR embOS libraries are compiled with round robin scheduling disabled and task names disabled, which results in smaller data structures, smaller code size and faster context switching time.</li>
        </ol>
        <h3>Improvements</h3>
        <ol>
          <li>Internal optimizations.<br>
            Some internal optimizations were performed to optimize task switching time and interrupt latencies.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.50a  [12. Jul 2007]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>System stack check corrected.<br>
            The system stack check failed in the case the system stack grows from lower addresses to higher addresses.<br>
            In this case, the system stack was not correctly filled with the stack check pattern.<br>
            The problem existed for embOS for PIC only and is fixed with version 3.50a.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.50  [10. Jul 2007]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>Scheduler optimized.<br>
            The embOS scheduler was optimized to reduce task switching time and interrupt latencies.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.40d  [05. Jul 2007]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>OS_Yield() now writes an entry into the trace buffer.<br>
            When using the debug library with trace capabilities, OS_Yield() writes an entry into the trace buffer which shows the function call and the calling task.<br>
            embOSView version 3.40d is required to show this entry.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_Suspend() corrected.<br>
            When using the debug library with trace capabilities, a call of OS_Suspend() wrote a wrong trace code into the trace buffer.<br>
            Instead of writing the code for task suspension, the code for task termination was written.<br>
            The function itself worked correctly, only the data written into the trace buffer was wrong.<br>
            The problem existed in all previous embOS versions and is fixed with version 3.40d.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.40c  [22. Jun 2007]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_Yield() may suspend a task unconditionally.<br>
            When tasks are running on round robin with timeslice, the function OS_Yield() can be used to end the timeslice of the running task immediately and activate an other task with the same priority which is ready for execution. The function has no effect on tasks that are not running on round robin.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.40b  [19. Jun 2007]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>Queue management improved.<br>
            For some CPUs, the buffer start address for Queues has to be aligned. Now embOS automatically corrects the alignment, if required.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.40a  [05. Jun 2007]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>Counting semaphores improved.<br>
            The counters of counting semaphores are now integer values.<br>
            Error handling is also improved. When a counting semaphore overflows, the embOS error handler OS_Error() is called in debug builds.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.40  [08. May 2007]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Task switch time can be measured by application.<br>
           embOS now comes with sample applications which allow accurate measurement of task switch time in a running application.</li>
        </ol>
        <h3>Improvements</h3>
        <ol>
          <li>Task switch time improved.<br>
            Scheduling optimized to improve task switch time.</li>
          <li>Task switch time improved for task events.<br>
            Task event handling modified to improve task switch time for tasks waiting on events.</li>
          <li>Interrupt latency improved.<br>
            During task switch, the time period when interrupts are disabled is reduced.</li>
          <li>embOS timer tick handler improved.<br>
            The standard timer tick handler run faster now. The embOS internal time variable is incremented by 1 on every timer tick.<br>
            When different increments are required, the new timer tick handler OS_HandleTick_Ex(), OS_TickHandler_Ex() or OS_HandleTickDI_Ex() have to be used by application.<br>
            Different increments may be configured by a call of OS_CONFIG().</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.32o  [19. Apr 2007]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_Unuse() corrected<br>
            OS_Unuse() must not be called from a task that does not claim the resource semaphore.<br>
            According to the documentation, the debug build of embOS should generate a call to OS_Error() if this fault happens.<br>
            All previous versions of embOS did not call OS_Error(). Now, OS_Error() will be called in that situation with error code 156: OS_ERR_RESOURCE_OWNER().</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.32n  [16. Apr 2007]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_SUSPEND_TASK_ON_TERMINATE implemented.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>Fixes a Windows bug which caused emBOS Simulation to crash.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.32m  [02. Apr 2007]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_TimerEx implemented.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.32l  [28. Mar 2007]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>Task switch to OS_Idle() modified.<br>
            The call of OS_Idle() from OS_ChangeTask can be overwritten (inhibited) by defining the macro OS_IDLE() which is normally defined as OS_Idle().<br>
            This allows task switching via an exception for specific CPU/compiler versions.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_EVENT_Delete() corrected<br>
            OS_EVENT_Delete() did not work correctly. OS_LeaveRegion() was called inside the function without calling OS_EnterRegion() before.<br>
            In debug builds of embOS, the error-handler OS_Error() was called with error 151 (OS_ERR_LEAVEREGION_BEFORE_ENTERREGION).<br>
            In release builds the system was blocked because the underflow of region count inhibits all further task switches, or system crashes, because incrementing the region count the next time allows task switches instead of blocking them. The problem existed in all previous versions and is fixed with version 3.32l.</li>
          <li>Round-robin task switching corrected.<br>
            Round robin task switching did not work correctly in previous version. A task which was blocked for some reason could be activated. The system crashed during task switch.<br>
            The problem existed since version 3.32j and is fixed with version 3.32l.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.32k  [21. Mar 2007]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>Handler function _OS_OnTx() for serial communication to embOSView corrected.<br>
            The transmission handler for communication with embOSView might have sent incorrect data to embOSView, because internal control state was updated after sending the data.<br>
            The problem occurred on a new embOS port for a specific CPU only and is fixed with version 3.32k.</li>
        </ol>
      </div>
    </div>
  </div>
  </div>  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.32j  [31. Jan 2007]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_CSemaRequest() implemented.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.32i  [26. Jan 2007]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>Switch to OS_Idle() modified.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.32h  [15. Jan 2007]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_Error() was required in release build when resource semaphores were used.<br>
            When using release build libraries and resource semaphores, the embOS error handler OS_Error() was required and the file OS_Error.c had to be compiled and linked in a project.<br>
            The problem existed since version 3.28i of embOS and is fixed with version 3.32h.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.32g  [30. Dec 2006]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>Pointer comparison improved for fixed size memory pools (OS_MEMF module).<br>
            Some compiler produced wrong pointer comparison code in far memory model.<br>
            For specific CPU/compiler versions, the new OS_POINTER_TO_VALUE() function was introduced to deliver correct results in pointer comparison.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.32f  [07. Dec 2006]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>OS_INIT_SYS_LOCKS() added.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.32e  [07. Nov 2006]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_GetMessageCnt() corrected.<br>
            The type of the retun value of OS_GetMessageCnt() was an unsigned integer in release builds, but an integer in debubg builds.<br>
            This was corrected to return an unsigned integer in all builds.<br>
            The problem existed in all previous versions of embOS end is fixed with version 3.32e.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.32d  [05. Nov 2006]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_GetMessageCnt() corrected.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.32c  [22. Sep 2006]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_EVENT_WaitTimed() implemented.<br>
            New event object function to wait for an event with a timeout limit.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.32b  [18. Sep 2006]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Task context modified for debug builds.<br>
            The number of task activations is now part of the task context in debug builds.<br>
            The number of activations are therefore displayed in the task list window of embOS plugin, when an embOS debug library is used.<br>
            Previous versions of embOS showed this information in profiling builds only.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.32a  [04. Aug 2006]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>A parameter may be passed to a task function.<br>
            Using the new embOS functions OS_CREATETASK_EX() or OS_CreateTaskEx() allows to pass a void pointer as parameter to a task.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>embOSView corrected.<br>
            embOSView sometimes showed wrong task state "Terminated" for tasks which were not terminated.<br>
            This bug existed in all previous versions of emBOSView and is fixed with version 3.32a.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.32  [18. Jul 2006]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Event objects introduced.<br>
            Event objects are standalone objects which are not assigned to a specific task.<br>
            Event objects may be used to synchronize one or multiple task to a specific event.<br>
            Events can be triggered from a task, a timer, or an interrupt handler.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.30d  [20. Jun 2006]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_MEMF_Create() corrected.<br>
            Alignment check of buffers for fixed size memory blocks did not work correctly in debug libraries of embOS.<br>
            OS_Error() was called during OS_MEMF_Create(), even though the memory pool buffers start address was correctly aligned.<br>
            This problem existed since embOS version 3.28m in all debug build libraries and is fixed with version 3.30d.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.30b  [18. May 2006]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_Suspend() corrected.<br>
            OS_Suspend() did not work correctly, when an activated task with higher priority than the running task was suspended.<br>
            When the task with highest priority was suspended during system initialization before embOS was started, embOS crashed during the call of OS_Start(), or called the embOS error handler OS_Error() with error code OS_ERR_INV_TASK (128).<br>
            The same crash occurred, when the application was running in a critical region and a task with higher priority was activated, but not started because of the critical region, and was then suspended by a call of OS_Suspend().<br>
            This problem existed in all previous embOS versions and is fixed with version 3.30b.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.30a  [10. May 2006]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>embOS internal time handling modified to allow long delays.<br>
            For 8- and 16-bit CPUs the maximum range for delays and timer periods is limited to 32767 embOS timer ticks, because time comparison ist done by integer calculation.<br>
            By recompiling sources with data type OS_TIME defined as signed long, longer delays and timer periods up to 2147483647 ticks can be realized.<br>
            The embOS libraries of object versions for 8- and 16-bit CPUs are still delivered with the limitation to 32767 timer ticks.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.28q  [17. Feb 2006]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>Problem with suspended tasks which were on delay fixed.<br>
            If a task which was on delay was suspended, the delay timer for that task was not handled.<br>
            This might have resulted in additional longer delay when the task was resumed later.<br>
            This problem existed in all previous embOS versions and is fixed with version 3.28q.</li>
        </ol>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.28p  [16. Feb 2006]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>New error handling for version without round robin scheduling.<br>
            In debug versions of embOS, OS_Error() is called with error code OS_ERR_TASK_PRIORITY, if a task is created with a priority which is already assigned to an other task.<br>
            OS_Error() is also called with the same error code, if a task priority is assigned by call of OS_SetPriority() and the new priority is already assigned to an other task.<br>
            Round robin switching can be disabled by recompiling sources with OS_RR_SUPPORTED defined as 0.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_Suspend() corrected.<br>
            OS_Suspend() did not work correctly, when the current task was suspended from within an interrupt handler, or from a critical region.<br>
            The application crashed, or called the embOS error handler OS_Error() with error code OS_ERR_INV_TASK (128).<br>
            As OS_Suspend() automatically enters a critical region in debug-trace builds, OS_Suspend() also failed, when it was called to suspend the current task in debug-trace builds of embOS.<br>
            This problem existed in all previous embOS versions and is fixed with version 3.28p.</li>
          <li>Alignment problems fixed for fixed size memory blocks<br>
            Some CPUs, mainly the 32bit RISC types, require aligned buffer start addresses for fixed size memory pools.<br>
            The debug version of embOS now checks alignment of buffer start address and data blocks in the buffer. If data blocks and buffer start address is not aligned, an error is generated and embOS error handler is called during creation of a fixed size memory pool.<br>
            This problem existed in all previous embOS versions and is fixed with version 3.28m.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.28n  [05. Feb 2006]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>embOS round-robin scheduling may be disabled.<br>
            Round-robin scheduling may be disabled by recompiling sources with OS_RR_SUPPORTED defined as 0.<br>
            This will save some bytes of RAM and ROM and may make sense for small CPUs.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.28l  [16. Oct 2005]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_SignalCSemaMax().<br>
            New counting semaphore handling function which specifies a maximum count value.<br>
            This allows counting semaphores used as binary semaphores.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_MEMF_Free() added.<br>
            The function OS_MEMF_Free() was not included in embOS libraries, but was documented in embOS users manual and was also declared in RTOS.h.<br>
            This problem existed in all previous embOS versions and is fixed with version 3.28l.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.28k  [15. Oct 2005]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_MEMF_IsInPool() corrected.<br>
            OS_MEMF_IsInPool() failed, if a pointer was checked which pointed to the first address after the memory pool. This pointer was reported as belonging to the pool.<br>
            This problem existed in all previous embOS versions and is fixed with version 3.28g.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.28i  [14. Oct 2005]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_DeleteRSema().<br>
            New resource semaphore handling function allows to delete resource semaphores during runtime.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.28h  [29. Aug 2005]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Additional error checks in debug builds of embOS.<br>
            OS_CreateRSema() now generates an error, when the addressed resource semaphore was already created before.<br>
            OS_CreateCSema() now generates an error, when the addressed counting semaphore was already created before.<br>
            OS_CreateMB() now generates an error, when the mailbox was already created before.<br>
            OS_CreateTimer() now generates an error, when the software timer was already created before.<br>
            OS_MEMF_Create() now generates an error, when the addressed fixed size memory pool was already created before.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.28g  [23. Aug 2005]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_GetSuspendCnt().<br>
            New info function to examine suspension state and count of a task.</li>
        </ol>
        <h3>Improvements</h3>
        <ol>
          <li>embOS scheduling simplified.<br>
            Task activation and deactivation on "waitable objects" as mailboxes, semaphores, events, fixed size memory blocks now all use the same scheduling method.<br>
            This modification saves ROM and RAM and makes scheduler easier to understand and to maintain.<br>
            Applications which accessed internal data structures of waitable objects directly have to be modified.</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_WakeTask() for trace build corrected.<br>
            OS_WakeTask() in trace build disabled task switches.<br>
            This problem existed since version 3.24 and is fixed with version 3.28g.</li>
          <li>OS_GetMailTimed() / mailbox handling corrected.<br>
            During call of OS_GetMailTimed, interrupts were re-enabled too early. If a mail was just put into a mailbox and the timeout occurred at the same time, a mailbox internal control variables which managed waiting tasks was set to a wrong value.<br>
            This resulted in wrong mailbox handling and caused task waiting for mail kept suspended, even though, mail was available. This problem existed in all previous versions of embOS and is fixed with version 3.28g.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.26a [22. Mar 2005]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_MEMF_Release() corrected.<br>
            OS_MEMF_Release() might have failed according to absolute address of memory block.<br>
            The problem occurred because address calculation was done with 16bit integer value.<br>
            Calculation was modified to use 32bit values to fix the problem.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.26  [21. Mar 2005]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_Terminate() modified.<br>
            Tasks may be terminated anytime, regardless of task state.<br>
            All resources claimed by the terminated task are automatically released.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.24  [25. Nov 2004]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>Stack check performance increased,<br>
            Stack check now runs much faster on 32- and 16-bit target CPUs.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.22a  [24. Sep 2004]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_PutMailFront() / OS_PutMailFront1().<br>
            New mailbox functions to enable LIFO behavior of mailboxes.</li>
          <li>OS_PutMailFrontCond() / OS_PutMailFrontCond1().<br>
            New conditional mailbox functions to enable LIFO behavior of mailboxes.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.20d  [22. Jan 2004]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_GetMailTimed corrected,</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.20c  [01. Dec 2003]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_GetMailTimed() corrected.<br>
            OS_GetMailTimed() did not retrieve a mail after 256 calls, the waiting task remained suspended. Corrected with version 3.20c of embOS.<br>
            This problem exists in all previous embOS versions and is fixed with version 3.20c.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.20  [28. Oct 2003]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_Suspend() / OS_Resume() implemented.<br>
            New functions to suspend and resume tasks unconditionally.</li>
          <li>Fixed size memory blocks implemented.<br>
            New functions to allocate fixed size memory blocks from embOS.</li>
          <li>Dynamic memory allocation supported by embOS.<br>
            Thread safe dynamic memory allocation functions implemented.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.10r  [12. Jun 2003]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_TASK structure definition modified.<br>
            Previous definition of OS_Task structure may cause linker warnings [w6] and [w35] even though everything was correct.<br>
            The problem was caused by unions defined inside a structure.<br>
            OS_TASK definition was modified to avoid those linker warnings.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.10q  [12. Jun 2003]</h2>
      <div>
        <h3>Improvements</h3>
        <ol>
          <li>OS_CreateTask now initializes profiling variables. (Required if TCB is used multiple times)</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_GetMail().<br>
            OS_GetMail functions corrected (interrupts disabled before call of _GetMail).</li>
          <li>OS_Terminate problem with RR.<br>
            OS_Terminate problem with RR tasks corrected. TimerTick could set RR/PP pending between UNMARKTASK and OS_Switch. OS_Switch will then call OS_DoRR, which could append OS_pCurrentTask (the one you want to terminate if e.g. OS_Terminate(NULL)).</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.10n  [13. Mar 2003]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>Sample interrupt handler.<br>
            For embOS it is not legal to call OS_EnterInterrupt again after final call of OS_LeaveInterrupt has been made. In the sample OS_irq_handler shipped with embOS, there was a possible call of OS_EnterInterrupt after OS_LeaveInterrupt. The sample OS_irq_handler implementation has been corrected.</li>
        </ol>
      </div>
    </div>
  </div>  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.10k  [13. Jan 2003]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_GetMailTimed().<br>
            New mailbox retrieving function with timeout.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.10d  [05. Aug 2002]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_GetpCurrentTimer().<br>
            New info routine. May be used in timer callback routines to examine which timer expired.</li>
          <li>OS_GetpCurrentTask().<br>
            New info routine. May be used to examine current running task.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.10  [01. Aug 2002]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Data format for communication with embOSView modified.<br>
            For terminal I/O in embOSView, the data format was changed. Therefore embOSView V3.10 or later is required.</li>
          <li>OS_WaitSingleEvent().<br>
            Unmasked events remain unchanged when function returns.</li>
          <li>OS_WaitSingleEventTimed().<br>
            Unmasked events remain unchanged when function returns. Timeout for waiting can be specified.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.08a  [24. May 2002]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Message Queue functionality enhanced.<br>
            OS_Q_GetPtrCond() function enables conditional request of data from Queue without task suspension.<br>
            OS_Q_GetMessageCnt() functions delivers number of messages in the queue.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.08  [08. Mar 2002]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>Message Queues.<br>
            Message queues enable intertask communication with messages of various size.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.06h  [24. Oct 2001]</h2>
      <div>
        <h3>Program corrections</h3>
        <ol>
          <li>OS_Unuse error code corrected.<br>
            When calling OS_Unuse() more often than OS_Use(), the debug version generated an OS_ERR_TASKLIST_CORRUPT error instead of OS_ERR_UNUSE_BEFORE_USE.<br>
            This problem exists in all previous embOS versions and is fixed with version 3.06h.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.06f  [24. Oct 2001]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>OS_Use now returns a value.<br>
            When using a resource semaphore with a call of OS_Use(), the actual usage counter of the requested semaphore is returned as integer value.<br>
            This may be helpful for some applications and is a lot more efficient than calling OS_Use() and then check the usage counter by calling OS_GetSemaValue().</li>
        </ol>
        <h3>Program corrections</h3>
        <ol>
          <li>Round Robin Task Problem corrected.<br>
            In very specific situation it was possible that a round robin task got 100%
            of CPU time for round robin tasks instead of sharing that time with other
            round robin tasks.</li>
        </ol>
      </div>
    </div>
  </div>
  <div id="features" class="divider-global">
    <div class="container">
      <h2>Version V3.06  [23. Jul 2001]</h2>
      <div>
        <h3>New Features</h3>
        <ol>
          <li>All features of generic 3.06 kernel supported.</li>
        </ol>
    </div>
  </div>

  <!-- ****************************************************************** -->
  <!-- Modifiable information ends here                                   -->
  <!-- Don't forget to edit the "Copyright" year if necessary and         -->
  <!-- >>>>>if a SUPPORT E-MAIL is required change the info@segger.com<<<<<<  -->
  <!-- ****************************************************************** -->

</main>
<div class="footer">
  <div class="container">
    <div>
      <p>Copyright 2001-2021 SEGGER Microcontroller GmbH. All rights reserved.<br>
        For more information, please visit our website&nbsp;<a href="https://www.segger.com/" target="_blank">www.segger.com</a>&nbsp;or contact us at&nbsp;<a href="mailto:support_embos@segger.com">support_embos@segger.com</a>&nbsp;</p>
    </div>
  </div>
</div>
</body>
</html>